package RRHH_Modelo;

import Conexion.Conexion;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class RHH_DEUDA {

    private int ID;
    private int ID_USUARIO;
    private int ID_TIPO_DESCUENTO;
    private double DEUDA_TOTAL;
    private Conexion con = null;

    public RHH_DEUDA(Conexion con) {
        this.con = con;
    }

    public RHH_DEUDA(int ID, int ID_USUARIO, double DEUDA_TOTAL, int ID_TIPO_DESCUENTO) {
        this.ID = ID;
        this.ID_USUARIO = ID_USUARIO;
        this.DEUDA_TOTAL = DEUDA_TOTAL;
        this.ID_TIPO_DESCUENTO = ID_TIPO_DESCUENTO;
    }

    public int Insertar() throws SQLException {
        String consulta = "insert into BROKER.RHH_DEUDA (ID, ID_USUARIO, DEUDA_TOTAL, ID_TIPO_DESCUENTO) VALUES (" + ID + "," + ID_USUARIO + "," + DEUDA_TOTAL + ", "+ID_TIPO_DESCUENTO+")";
        con.EjecutarSentencia(consulta);
        consulta = "select BROKER.RHH_DEUDA_SEQ.currval as ID from dual";
        ResultSet rs = con.EjecutarConsulta(consulta);
        rs.next();
        return rs.getInt("ID");
    }

    public boolean EliminarXid() throws SQLException {
        String consulta = "delete from BROKER.RHH_DEUDA where ID= " + getID();
        con.EjecutarSentencia(consulta);
        return true;
    }

    public List<RHH_DEUDA> Todos() throws SQLException {
        String consulta = "select * from BROKER.RHH_DEUDA";
        ResultSet rs = con.EjecutarConsulta(consulta);
        return Cargar(rs);
    }
    
    public double TotalDeudaActual() throws SQLException {
        String consulta = "SELECT(    SELECT (sum( a.DEUDA_TOTAL - CASE WHEN SUM (RHH_PAGOS_REALIZADOS.MONTO) "
                           +"IS NULL THEN 0 ELSE SUM (RHH_PAGOS_REALIZADOS.MONTO) end)) "
                           +"FROM BROKER.RHH_DEUDA a, BROKER.RHH_PAGOS_REALIZADOS  "
                           +"WHERE (RHH_PAGOS_REALIZADOS.ID_DEUDA(+) = a.ID)"
                           +"AND (a.ID = "+getID()+") "
                           +"GROUP BY a.DEUDA_TOTAL)   - ("
                           +"              SELECT CASE WHEN (SELECT (SUM (CASE WHEN RHH_AMORTIZACION.MONTO IS NULL "
                           +"                          THEN 0 ELSE RHH_AMORTIZACION.MONTO END))  "
                           +"                                              FROM BROKER.RHH_AMORTIZACION, BROKER.RHH_DEUDA"
                           +"                                              WHERE (RHH_AMORTIZACION.ID_DEUDA = RHH_DEUDA.ID(+))"
                           +"                                               AND (RHH_AMORTIZACION.ID_DEUDA = "+getID()+")"
                           +"                                              group by RHH_DEUDA.id) IS NULL THEN 0 "
                           +"                           ELSE (SELECT (SUM (CASE WHEN RHH_AMORTIZACION.MONTO IS NULL" 
                           +"                           THEN 0 "
                           +"                           ELSE RHH_AMORTIZACION.MONTO" 
                           +"                            END))  "
                           +"               FROM BROKER.RHH_AMORTIZACION, BROKER.RHH_DEUDA "
                           +"               WHERE (RHH_AMORTIZACION.ID_DEUDA = RHH_DEUDA.ID(+)) "
                           +"               AND (RHH_AMORTIZACION.ID_DEUDA = "+getID()+")"
                           +"               group by RHH_DEUDA.id) END FROM DUAL ) as deuda from DUAL"; 
   ResultSet rs = con.EjecutarConsulta(consulta);
        if(rs.next())
            return rs.getDouble("DEUDA");
        else
            return 0;
    }
    public int Cantidad_pagos_realizados() throws SQLException {
        String consulta = "SELECT COUNT(RHH_PAGOS_REALIZADOS.MONTO) as suma\n" +
            "  FROM BROKER.RHH_DEUDA, BROKER.RHH_PAGOS_REALIZADOS\n" +
            " WHERE (RHH_PAGOS_REALIZADOS.ID_DEUDA = RHH_DEUDA.ID) AND\n" +
            " RHH_DEUDA.ID="+getID();
        ResultSet rs = con.EjecutarConsulta(consulta);
        rs.next();
        return rs.getInt("suma");
    }
    public int Cantidad_pagosXdeuda() throws SQLException {
        String consulta = "SELECT RHH_MODIFICACION.*\n"
                + "  FROM BROKER.RHH_MODIFICACION\n"
                + "where  RHH_MODIFICACION.ID_DEUDA = "+getID()+"\n"
                + "and RHH_MODIFICACION.ID = (SELECT max(RHH_MODIFICACION.ID)\n"
                + "  FROM BROKER.RHH_MODIFICACION\n"
                + "where  RHH_MODIFICACION.ID_DEUDA = "+getID()+")";
        ResultSet rs = con.EjecutarConsulta(consulta);
        rs.next();
        return rs.getInt("CANTIDAD_MESES");
    }
    
   
    public List<RHH_DEUDA> TodasPendientes(int id_usuario) throws SQLException {
        String consulta = "SELECT RHH_DEUDA.*\n" +
                        "FROM BROKER.RHH_DEUDA \n" +
                        "WHERE RHH_DEUDA.ID_USUARIO="+id_usuario+" \n" +
                        "AND RHH_DEUDA.ID NOT IN (\n" +
                        "SELECT FUERA.ID\n" +
                        "FROM BROKER.RHH_DEUDA FUERA, BROKER.RHH_MODIFICACION, BROKER.RHH_USUARIO\n" +
                        "WHERE  (RHH_MODIFICACION.ID_DEUDA = FUERA.ID)\n" +
                        "AND (FUERA.ID_USUARIO = RHH_USUARIO.ID)\n" +
                        "AND (RHH_USUARIO.ID = "+id_usuario+") \n" +
                        "AND  FUERA.DEUDA_TOTAL = (SELECT sum(RHH_PAGOS_REALIZADOS.MONTO)\n" +
                        "FROM BROKER.RHH_PAGOS_REALIZADOS, BROKER.RHH_DEUDA\n" +
                        "WHERE (RHH_PAGOS_REALIZADOS.ID_DEUDA = RHH_DEUDA.ID) AND (RHH_DEUDA.ID=FUERA.ID)))";
 
        ResultSet rs = con.EjecutarConsulta(consulta);
        return Cargar(rs);
    }
    
    public List<RHH_DEUDA> Todas_Anticipo_Pendientes(int id_usuario) throws SQLException {
        String consulta = "SELECT RHH_DEUDA.*\n" +
                            "  FROM BROKER.RHH_TIPO_DESCUENTO, BROKER.RHH_DEUDA\n" +
                            " WHERE     (RHH_DEUDA.ID_TIPO_DESCUENTO = RHH_TIPO_DESCUENTO.ID)\n" +
                            "       AND (RHH_DEUDA.ID_USUARIO = "+id_usuario+")\n" +
                            "       AND (RHH_TIPO_DESCUENTO.TIPO = 1)";
 
        ResultSet rs = con.EjecutarConsulta(consulta);
        return Cargar(rs);
    }
    public List<RHH_DEUDA> Todas_Descuento_Pendientes(int id_usuario) throws SQLException {
        String consulta = "SELECT RHH_DEUDA.*\n" +
                            "  FROM BROKER.RHH_TIPO_DESCUENTO, BROKER.RHH_DEUDA\n" +
                            " WHERE     (RHH_DEUDA.ID_TIPO_DESCUENTO = RHH_TIPO_DESCUENTO.ID)\n" +
                            "       AND (RHH_DEUDA.ID_USUARIO = "+id_usuario+")\n" +
                            "       AND (RHH_TIPO_DESCUENTO.TIPO = 2)";
 
        ResultSet rs = con.EjecutarConsulta(consulta);
        return Cargar(rs);
    }

    public List<RHH_DEUDA> Cargar(ResultSet rs) throws SQLException {
        List<RHH_DEUDA> lista = new ArrayList<RHH_DEUDA>();
        while (rs.next()) {
            RHH_DEUDA objeto = new RHH_DEUDA(con);
            objeto.setID(rs.getInt("ID"));
            objeto.setID_USUARIO(rs.getInt("ID_USUARIO"));
            objeto.setDEUDA_TOTAL(rs.getDouble("DEUDA_TOTAL"));
            objeto.setID_TIPO_DESCUENTO(rs.getInt("ID_TIPO_DESCUENTO"));
            lista.add(objeto);
        }
        return lista;
    }

    public int getID_TIPO_DESCUENTO() {
        return ID_TIPO_DESCUENTO;
    }

    public void setID_TIPO_DESCUENTO(int ID_TIPO_DESCUENTO) {
        this.ID_TIPO_DESCUENTO = ID_TIPO_DESCUENTO;
    }

    
    
    public int getID() {
        return ID;
    }

    public void setID(int ID) {
        this.ID = ID;
    }

    public int getID_USUARIO() {
        return ID_USUARIO;
    }

    public void setID_USUARIO(int ID_USUARIO) {
        this.ID_USUARIO = ID_USUARIO;
    }

    public double getDEUDA_TOTAL() {
        return DEUDA_TOTAL;
    }

    public void setDEUDA_TOTAL(double DEUDA_TOTAL) {
        this.DEUDA_TOTAL = DEUDA_TOTAL;
    }

    public Conexion getCon() {
        return this.con;
    }

    public void setCon(Conexion con) {
        this.con = con;
    }
}
